package cn.bookcycle.panda.pay.util;

import java.util.HashMap;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.json.JSONArray;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ser.std.StdKeySerializers.Default;

import cn.bookcycle.panda.pay.constant.BusinessData;
import cn.bookcycle.panda.pay.constant.NameData;
import cn.bookcycle.panda.pay.constant.SymbolData;
import cn.bookcycle.panda.pay.constant.WeChatData;
import cn.bookcycle.panda.pay.pojo.ParametersBase;

/**
 * 数据处理工具类
 *
 * @author liufenglin
 * @date 2018年1月31日
 */
public class DataDeal {
	private static final Logger logger = LoggerFactory.getLogger(DataDeal.class);
	
	/**
	 * 给xmlStr附加appId、mchId、nonceStr、notifyUrl、tradeType、sign
	 * 
	 * @param xmlStr 
	 * @param account 收款账户
	 * @return
	 */
	public static String addXMLData(String xmlStr, ParametersBase para) {
		logger.info("addXMLData 收到的xmlStr是：{}", xmlStr);
		Document document = null;
		try {
			document = DocumentHelper.parseText(xmlStr);
		} catch (DocumentException e) {
			logger.warn("addXMLData()解析xmlStr数据异常");
			logger.warn("xmlStr：{}", xmlStr);
			// 为了避免空指针异常
			document = DocumentHelper.createDocument();
		} 
		
		// 获取document的根节点
		Element root = document.getRootElement();
		// 加入appId节点
		root.addElement(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.APP_ID)).addText(para.getAppId());
		// 加入mchId节点
		root.addElement(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.MCH_ID)).addText(para.getMchId());
		// 加入nonceStr节点
		root.addElement(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.NONCE_STR)).addText(para.getNonceStr());
		// 加入notifyUrl节点
		root.addElement(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.NOTIFY_URL)).addText(WeChatData.NOTIFY_URL_VALUE);
		// 加入tradeType节点
		root.addElement(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.TRADE_TYPE)).addText(WeChatData.TRADE_TYPE_VALUE);
		// 加入sign节点
		root.addElement(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.SIGN)).addText(para.getSign());
		logger.info("addXMLData添加节点后的xml是：{}", document.asXML());
		return document.asXML();
	}
	
	
	/**
	 * 处理微信返回的数据，处理为本服务规定的数据内容
	 * 
	 * @param jsonStr JSON格式字符串
	 * @param tradeNo 订单号
	 * @return 处理后的Json字符串
	 */
	public static String dealReturnJson(String jsonStr, String tradeNo) {
		String returnJson = null;
		// 把json串的信息解析后，存储到map中
		Map<String, String> map = DataFormatConvert.jsonToMap(jsonStr);
		// returnMap用于存储returnJson的键值对，以便把键值对快速转为Json格式字符串
		Map<String, String> returnMap = new HashMap<String, String>();
		// return_code是SUCCESS表示与微信接口的通信成功，这是第一步
		if (NameData.SUCCESS.equals(map.get(NameData.RETURN_CODE))) {
			// 如果微信返回的result_code是SUCCESS表示业务结果成功，我们就向调用者发状态码50001,和支付二维码的URL，以及对应的订单号
			if (NameData.SUCCESS.equals(map.get(NameData.RESULT_CODE))) {
				returnMap.put(NameData.STATUS, BusinessData.SUCCESS_CODE);
				returnMap.put(NameData.CODE_URL, map.get(NameData.CODE_URL));
				returnMap.put(NameData.TRADE_NO, tradeNo);
			} else {
				// 根据不同的业务结果错误码，返回不同的状态信息
				switch (map.get(NameData.ERR_CODE)) {
				// 错误码"err_code":"ORDERPAID"表示用于已经支付了该笔订单
				case NameData.ORDERPAID:
					returnMap.put(NameData.STATUS, BusinessData.PAIED_CODE);
					break;
				// TODO 以后根据业务需求，加入更多的错误码
				default:
					break;
				} // end switch
			}
			// returnMap转Json格式字符串
			JSONArray jsonArray = new JSONArray();
			jsonArray.put(returnMap);
			// 过滤掉 斜杠符号,这个斜杠是由于org,json不识别转义符号，多余产生的
			returnJson = jsonArray.toString().replace(SymbolData.BACK_SLANT, "");
			int beginIndex = returnJson.indexOf("{");
			int endIndex = returnJson.lastIndexOf("}");
			// 去掉头尾多余的符号
			returnJson = returnJson.substring(beginIndex, endIndex + 1);
		} else {
			// 如果微信返回的return_code不是SUCCESS，就只能是FAIL，我们就向调用者发送默认状态码
			returnJson = BusinessData.DEFAULT_STATUS;
		}
		logger.warn("请求微信支付成功后，向调用者返回的 信息:{}", returnJson);
		return returnJson;
	}
}
